package com.wwy.producter;

import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.wwy.config.RabbitMqUtils;
import com.wwy.module.TbOrder;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Objects;

/**
 * @author 王伟羽
 * @date 2024/3/13 16:54
 */

@RestController
@RequestMapping(value = "/publishProducer")
public class PublishProducer {


    private final static String PUBLISH_PRODUCER1 = "publish_name_one";
    private final static String PUBLISH_PRODUCER2 = "publish_name_two";

    //交换机名称
    private final static String EXCHANGE_NAME = "publish_exchange";

    @Resource
    private RabbitTemplate rabbitTemplate;

    @GetMapping(value = "/publishSendMessage")
    public String publishSendMessage() {
        Connection connection = RabbitMqUtils.getConnection();
        if (Objects.nonNull(connection)) {
            Channel channel = null;
            try {
                channel = connection.createChannel();
                // 绑定交换机
                //参数1： exchange的名称
                //参数2： 指定exchange的类型
                //          FANOUT - pubsub ,    发布订阅
                //          DIRECT - Routing ,   路由模式
                //          TOPIC - Topics      topic
                channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
                //给交换机绑定对应的队列
                //将队列和交换机绑定
                //String var1, 队列名
                //String var2, 交换机名
                //String var3， 对应绑定队列 路由规则  "" 没有规则所有的队列消息一样
                channel.queueBind(PUBLISH_PRODUCER1, EXCHANGE_NAME, "");
                channel.queueBind(PUBLISH_PRODUCER2, EXCHANGE_NAME, "");
                // 参数1：指定exchange，使用""。   最简模式（helloword） 使用默认交换机
                // 参数2：指定路由的规则，
                //       使用具体的队列名称。
                //      参数2可以是队列名   也可以是路由规则

                // 参数3：指定传递的消息所携带的properties，使用null。
                // 参数4：指定发布的具体消息，byte[]类型

                for (int i = 1; i < 11; i++) {
                    TbOrder order = new TbOrder();
                    order.setMsg("测试"+i);
                    order.setStatus(1);
                    order.setUserId("10086"+i);
                    order.setOrderId("98745"+i);
                    if(i==2){
                        order.setOrderId("98745"+(i-1));
                    }
                    // 消息向交换机发送，没有匹配路由规则
                    channel.basicPublish(EXCHANGE_NAME, PUBLISH_PRODUCER1, null, (JSONObject.toJSONString(order)).getBytes("utf-8"));
                }
                return "发送成功！";
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "mq出错！";
    }

    @GetMapping(value = "/PublicSubscribe")
    public void PublicSubscribe() {
        for (int i = 1; i < 11; i++) {
            TbOrder order = new TbOrder();
            order.setMsg("测试"+i);
            order.setStatus(1);
            order.setUserId("10086"+i);
            order.setOrderId("98745"+i);
            if(i==2){
                order.setOrderId("98745"+(i-1));
            }
            // 消息向交换机发送，没有匹配路由规则
            rabbitTemplate.convertAndSend("publish_exchange_one", "", JSONObject.toJSONString(order), new CorrelationData(order.getOrderId()));
        }
    }


}
